#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/wait.h>
#include <stdlib.h>
int main()
{
    pid_t childpid;/*子进程的 PID*/
    int retval;/*由用户提供的子进程返回值*/
    int status;/*子进程向父进程提供的退出状态*/

    /*创建一个新进程*/
    childpid=fork( );

    if(childpid>=0)//创建成功
    {
        if (childpid==0)//fork()的返回值为0，这表示当前处在子进程中
        {
            printf("CHILD:I am the child process!\n");
            printf("CHILD:Here's my PID:%d\n",getpid()); //输出当前进程的PID
            printf("CHILD:My parent's PID is:%d\n",getppid());//输出当前进程的父进程的PID
            printf("CHILD: The value of fork return is: %d\n", childpid); //输出 fork()的返回值
            printf("CHILD:Sleep for 1 second...\n");
            sleep(1);  //让当前进程睡眠1秒
            printf("CHILD:Enter an exit value(0~255):");//输入子进程执行完毕后的返回值
            scanf(" %d",&retval);
            printf("CHILD: Goodbye!\n");
            exit(retval);//子进程退出，退出值为用户给定的返回值
         }
        else  //fork()返回一个新的PID，这表示当前处在父进程中
        {
            printf("PARENT:I am the parent process!\n");
            printf("PARENT:Here's my PID:%d\n",getpid());//输出当前进程的 PID
            printf("PARENT: The value of my child's PID is: %d\n",childpid);//输出当前进程的子进程的PID
            printf("PARENT:I will now wait for my child to exit.\n");//等待子进程运行结束，并保存其状态
            wait(&status);
            printf("PARENT:Child's exitcode is:%d\n",WEXITSTATUS (status));//输出子进程的返回值
            printf("PARENT: Goodbye!\n");//父进程退出
            exit(0);
        }
    }
    else  //fork()返回-1，这表示进程创建失败
    {
        perror("fork error!");//显示错误信息
        exit(0);
    }
    return 0;
}
